/*
 * @Author: sparkstudiosju 419785598@qq.com
 * @Date: 2025-08-29 13:12:04
 * @LastEditors: sparkstudiosju 419785598@qq.com
 * @LastEditTime: 2025-08-29 13:12:04
 * @FilePath: /SJUDEMO_HAL/include/seg7.h
 * @Description: 数码管驱动 - 通过74HC595驱动
 * 
 * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. 
 */
#ifndef SEG7_H
#define SEG7_H

#include "stm32f1xx_hal.h"

// ==================== 74HC595引脚定义 ====================
#define SEG7_SHCP_GPIO_PORT    GPIOB
#define SEG7_SHCP_PIN          GPIO_PIN_13    // 移位时钟
#define SEG7_STCP_GPIO_PORT    GPIOB
#define SEG7_STCP_PIN          GPIO_PIN_14    // 锁存输出时钟
#define SEG7_DS_GPIO_PORT      GPIOB
#define SEG7_DS_PIN            GPIO_PIN_15    // 串行数据

// ==================== 引脚控制宏 ====================
#define SEG7_SHCP_HIGH()       HAL_GPIO_WritePin(SEG7_SHCP_GPIO_PORT, SEG7_SHCP_PIN, GPIO_PIN_SET)
#define SEG7_SHCP_LOW()        HAL_GPIO_WritePin(SEG7_SHCP_GPIO_PORT, SEG7_SHCP_PIN, GPIO_PIN_RESET)
#define SEG7_STCP_HIGH()       HAL_GPIO_WritePin(SEG7_STCP_GPIO_PORT, SEG7_STCP_PIN, GPIO_PIN_SET)
#define SEG7_STCP_LOW()        HAL_GPIO_WritePin(SEG7_STCP_GPIO_PORT, SEG7_STCP_PIN, GPIO_PIN_RESET)
#define SEG7_DS_HIGH()         HAL_GPIO_WritePin(SEG7_DS_GPIO_PORT, SEG7_DS_PIN, GPIO_PIN_SET)
#define SEG7_DS_LOW()          HAL_GPIO_WritePin(SEG7_DS_GPIO_PORT, SEG7_DS_PIN, GPIO_PIN_RESET)

// ==================== 数码管段码定义 ====================
// 驱动方式: 共阴
// 段码映射: A->Q1, B->Q2, C->Q0, D->Q6
//           E->Q5, F->Q3, G->Q4, DP->Q7
#define SEG_A    (1 << 1)  // Q1 - 顶部横段
#define SEG_B    (1 << 2)  // Q2 - 右上竖段
#define SEG_C    (1 << 0)  // Q0 - 右下竖段
#define SEG_D    (1 << 6)  // Q6 - 底部横段
#define SEG_E    (1 << 5)  // Q5 - 左下竖段
#define SEG_F    (1 << 3)  // Q3 - 左上竖段
#define SEG_G    (1 << 4)  // Q4 - 中间横段
#define SEG_DP   (1 << 7)  // Q7 - 小数点

// ==================== 数字段码表 ====================
// 0-9 数字的段码
extern const uint8_t seg7_digit_table[10];

// ==================== 字母段码表 ====================
// A-F 字母的段码
extern const uint8_t seg7_letter_table[6];

// ==================== 新连线段码表 ====================
// 新连线关系的数字段码表
extern const uint8_t seg7_digit_table_new[27];

// 新连线关系的字母段码表
extern const uint8_t seg7_letter_table_new[6];

// ==================== 函数声明 ====================
void SEG7_Init(void);                           // 初始化数码管
void SEG7_DisplayDigit(uint8_t digit);          // 显示数字 0-9
void SEG7_DisplayLetter(uint8_t letter);        // 显示字母 A-F
void SEG7_DisplayCustom(uint8_t segment_code);  // 显示自定义段码
void SEG7_Clear(void);                          // 清除显示
void SEG7_Test(void);                           // 测试显示

// ==================== 新连线函数声明 ====================
void SEG7_DisplayDigitNew(uint8_t digit);       // 使用新段码表显示数字
void SEG7_DisplayLetterNew(uint8_t letter);     // 使用新段码表显示字母
void SEG7_TestNew(void);                        // 使用新段码表测试显示

#endif // SEG7_H
